#ifndef ITAP_API_COMM_DEF_H
#define ITAP_API_COMM_DEF_H

#pragma pack(push, 1)

//=============================================================================
/**
 *	\addtogroup G_DATATYPE_CHARS	基本字符串类型定义
 *	@{
 */
//=============================================================================
namespace ITapTrade {
//! 长度为10的字符串
typedef char TAPISTR_10[11];
//! 长度为20的字符串
typedef char TAPISTR_20[21];
//! 长度为30的字符串
typedef char TAPISTR_30[31];
//! 长度为40的字符串
typedef char TAPISTR_40[41];
//! 长度为50的字符串
typedef char TAPISTR_50[51];
//! 长度为70的字符串
typedef char TAPISTR_70[71];
//! 长度为100的字符串
typedef char TAPISTR_100[101];
//! 长度为300的字符串
typedef char TAPISTR_300[301];
//! 长度为500的字符串
typedef char TAPISTR_500[501];
//! 长度为2000的字符串
typedef char TAPISTR_2000[2001];
//! Authorization Code
typedef char TAPIAUTHCODE[513];
//! MAC地址类型.
typedef char TAPIMACTYPE[13];
//! 二次认证序号
typedef char TAPISecondSerialIDType[5];
//! 单字符定义，可用于定义其他类型
typedef char TAPICHAR;
// 子账户类型
typedef char TAPIClientIDType[16];
// 下单人地址
typedef char TAPIClientLocationIDType[6];
/** @}*/

//=============================================================================
/**
 *	\addtogroup G_DATATYPE_NUMBER	基本数值类型定义
 *	@{
 */
//=============================================================================

//! int 32
typedef int TAPIINT32;
//! unsigned 32
typedef unsigned int TAPIUINT32;
//! int 64
typedef long long TAPIINT64;
//! unsigned 64
typedef unsigned long long TAPIUINT64;
//! unsigned 16
typedef unsigned short TAPIUINT16;
//! unsigned 8
typedef unsigned char TAPIUINT8;
//! real 64
typedef double TAPIREAL64;

/** @}*/

//=============================================================================
/**
 *	\addtogroup G_DATATYPE_YNFLAG	是否标示
 *	@{
 */
//=============================================================================
//! 是否标示
typedef TAPICHAR TAPIYNFLAG;
//! 是
const TAPIYNFLAG APIYNFLAG_YES = 'Y';
//! 否
const TAPIYNFLAG APIYNFLAG_NO = 'N';

/** @}*/

//=============================================================================
/**
 *	\addtogroup G_DATATYPE_PASSWORDTYEP	密码类型标识
 *	@{
 */
//=============================================================================
//! 密码类型
typedef TAPICHAR TAPIPasswordType;
//! 交易密码
const TAPIPasswordType APIPASSWORD_TRADE = 'T';
//! 电话密码
const TAPIPasswordType APIPASSWORD_PHONE = 'P';

/** @}*/

//=============================================================================
/**
 *	\addtogroup G_DATATYPE_DATETIME	日期时间类型定义
 *	@{
 */
//=============================================================================

//! 时间戳类型(格式 yyyy-MM-dd hh:nn:ss.xxx)
typedef char TAPIDTSTAMP[24];
//! 日期和时间类型(格式 yyyy-MM-dd hh:nn:ss)
typedef char TAPIDATETIME[20];
//! 日期类型(格式 yyyy-MM-dd)
typedef char TAPIDATE[11];
//! 时间类型(格式 hh:nn:ss)
typedef char TAPITIME[9];
/** @}*/

//=============================================================================
/**
 *	\addtogroup G_DATATYPE_LOG_LEVEL	日志级别
 *	@{
 */
//=============================================================================
//! 日志级别
typedef TAPICHAR TAPILOGLEVEL;
//! Normal
const TAPILOGLEVEL APILOGLEVEL_NONE = 'N';
//! Error
const TAPILOGLEVEL APILOGLEVEL_ERROR = 'E';
//! Warning
const TAPILOGLEVEL APILOGLEVEL_WARNING = 'W';
//! Debug
const TAPILOGLEVEL APILOGLEVEL_DEBUG = 'D';
/** @}*/

//=============================================================================
/**
 *	\addtogroup G_DATATYPE_OPTION_TYPE	期权类型
 *	@{
 */
//=============================================================================

typedef TAPICHAR TAPIOptionType;
//! 美式期权 + 权利金方式
const TAPIOptionType TAPI_OPTION_TYPE_AMERICAN = 'A';
//! 美式期权 + 期货方式
const TAPIOptionType TAPI_OPTION_TYPE_AMERICAN2 = 'B';
//! 欧式期权 + 权利金方式
const TAPIOptionType TAPI_OPTION_TYPE_EUROPEAN = 'E';
//! 欧式期权 + 期货方式
const TAPIOptionType TAPI_OPTION_TYPE_EUROPEAN2 = 'F';
/** @}*/

//=============================================================================
/**
 *	\addtogroup G_DATATYPE_COMMODITY_TYPE	品种类型
 *	@{
 */
//=============================================================================

//! 品种类型
typedef TAPICHAR TAPICommodityType;
//! 无
const TAPICommodityType TAPI_COMMODITY_TYPE_NONE = 'N';
//! 期货
const TAPICommodityType TAPI_COMMODITY_TYPE_FUTURES = 'F';
//! 期权
const TAPICommodityType TAPI_COMMODITY_TYPE_OPTION = 'O';
//! 跨期套利
const TAPICommodityType TAPI_COMMODITY_TYPE_SPREAD_MONTH = 'S';
//! 跨品种套利
const TAPICommodityType TAPI_COMMODITY_TYPE_SPREAD_COMMODITY = 'M';
//! 看涨垂直套利
const TAPICommodityType TAPI_COMMODITY_TYPE_BUL = 'U';
//! 看跌垂直套利
const TAPICommodityType TAPI_COMMODITY_TYPE_BER = 'E';
//! 跨式套利
const TAPICommodityType TAPI_COMMODITY_TYPE_STD = 'D';
//! 宽跨式套利
const TAPICommodityType TAPI_COMMODITY_TYPE_STG = 'G';
//! 备兑组合
const TAPICommodityType TAPI_COMMODITY_TYPE_PRT = 'R';
//! 外汇——直接汇率
const TAPICommodityType TAPI_COMMODITY_TYPE_DIRECTFOREX = 'X';
//! 外汇——间接汇率
const TAPICommodityType TAPI_COMMODITY_TYPE_INDIRECTFOREX = 'I';
//! 外汇——交叉汇率
const TAPICommodityType TAPI_COMMODITY_TYPE_CROSSFOREX = 'C';
//! 指数
const TAPICommodityType TAPI_COMMODITY_TYPE_INDEX = 'Z';
//! 股票/基金
const TAPICommodityType TAPI_COMMODITY_TYPE_STOCK = 'T';
//! TAS
const TAPICommodityType TAPI_COMMODITY_TYPE_TAS = 'B';
//! 港股--窝轮
const TAPICommodityType TAPI_COMMODITY_TYPE_DERIVATIVE = '0';
//! 港股--牛熊证
const TAPICommodityType TAPI_COMMODITY_TYPE_BULLBEAR = '1';
//! 港股--界内证
const TAPICommodityType TAPI_COMMODITY_TYPE_INLINE = '2';
//! 港股--债券
const TAPICommodityType TAPI_COMMODITY_TYPE_DBET = '3';
//! 港股--基金
const TAPICommodityType TAPI_COMMODITY_TYPE_FUND = '4';
//! 多腿套利
const TAPICommodityType TAPI_COMMODITY_TYPE_MULTI_LEG = '5';

/** @}*/

//=============================================================================
/**
 *	\addtogroup G_DATATYPE_CALL_OR_PUT	看涨看跌标示
 *	@{
 */
//=============================================================================

//! 看涨看跌标示
typedef TAPICHAR TAPICallOrPutFlagType;
//! 买权
const TAPICallOrPutFlagType TAPI_CALLPUT_FLAG_CALL = 'C';
//! 卖权
const TAPICallOrPutFlagType TAPI_CALLPUT_FLAG_PUT = 'P';
//! 无
const TAPICallOrPutFlagType TAPI_CALLPUT_FLAG_NONE = 'N';

/** @}*/

//! Application信息
struct TapAPIApplicationInfo {
    TAPIAUTHCODE AuthCode;            ///< 授权码
    TAPISTR_300 KeyOperationLogPath;  ///< 关键操作日志路径 APIRun日志
    TAPILOGLEVEL LogLevel;            ///< 日志级别
    TAPISTR_30 APPID;                 ///< 看穿式监管使用,北斗星系统不使用该字段
    TAPIINT32 ReConnectCount;         ///< 重连次数
    TAPIINT32 ReConnectSeconds;       ///< 重连时间间隔(秒)
};
/*
 * 关于自动重连的说明：
 * 1、开启重连条件：重连次数和重连时间间隔均大于0。
 * 2、重连次数：若只设置一个地址，该设置无实际含义。如果设置了多个地址，则一个地址重连次数到达设置次数时，自动切换下一个地址继续重连。
 * 3、重连时间间隔：尝试重连失败后，间隔设置秒数发起下一次重连。
 * 4、断开后立刻重连一次。重连次数是无限的，直到连接成功为止。
 * 5、可以在重连进行时主动调用Disconnect终止重连，否则重连时请勿进行其它操作。
 * 5、重连成功后自动进行登录和初始化等操作。
 */

//! 品种编码结构
struct TapAPICommodity {
    TAPISTR_10 ExchangeNo;            ///< 交易所编码
    TAPICommodityType CommodityType;  ///< 品种类型
    TAPISTR_10 CommodityNo;           ///< 品种编号
};

//! 合约编码结构
struct TapAPIContract {
    TapAPICommodity Commodity;             ///< 品种
    TAPISTR_10 ContractNo1;                ///< 合约代码1
    TAPISTR_10 StrikePrice1;               ///< 执行价1
    TAPICallOrPutFlagType CallOrPutFlag1;  ///< 看涨看跌标示1
    TAPISTR_10 ContractNo2;                ///< 合约代码2
    TAPISTR_10 StrikePrice2;               ///< 执行价2
    TAPICallOrPutFlagType CallOrPutFlag2;  ///< 看涨看跌标示2
};

//! 交易所信息
struct TapAPIExchangeInfo {
    TAPISTR_10 ExchangeNo;    ///< 交易所编码
    TAPISTR_20 ExchangeName;  ///< 交易所名称
};

//! 修改密码请求
struct TapAPIChangePasswordReq {
    TAPISTR_20 AccountNo;
    TAPIPasswordType PasswordType;  ///< 密码类型
    TAPISTR_20 OldPassword;         ///< 旧密码
    TAPISTR_20 NewPassword;         ///< 新密码
};
//!	认证密码请求
struct TapAPIAuthPasswordReq {
    TAPISTR_20 AccountNo;           ///< 客户账号
    TAPIPasswordType PasswordType;  ///< 密码类型
    TAPISTR_20 Password;            ///< 账户密码
};

#pragma pack(pop)
}  // namespace ITapTrade
#endif